//
//  themeUILabel.swift
//  Swift夜间模式
//
//  Created by Hahn on 2018/11/13.
//  Copyright © 2018 今晚打老虎. All rights reserved.
//

import Foundation
import UIKit

//extension就是themeUIView私有方法 相当于OC里面的Category
extension UILabel {
    
    enum UILabelColorType{
        case LabelColorBlack // 白天黑色, 夜间白色
        case LabelColorGray // 白天红色, 夜间白色
    }
    
    func themeWithType(type1:UILabelColorType)  {
        self.type1 = type1
        changeColor1()
        startMonitor1()
    }
    
    func startMonitor1(){
        NotificationCenter.default.addObserver(self, selector: #selector(changeColor1), name: NSNotification.Name.init("changeColor1"), object: nil)
    }
    
    @objc func changeColor1(){
        
        switch self.type1.unsafelyUnwrapped{
        case UILabelColorType.LabelColorBlack:
            self.textColor = theme.Theme.color2
            self.backgroundColor = UIColor.clear
        default:
            self.textColor = theme.Theme.color4
            self.backgroundColor = UIColor.clear
        }
    }
    
    //KVO模式
    var type1:UILabelColorType?{
        /**
         为KVO创建观察者
         objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
           id object                     :表示关联者，是一个对象，变量名理所当然也是object
           const void *key               :获取被关联者的索引key
           id value                      :被关联者，这里是一个block
         policy：关联策略。有五种关联策略。
         OBJC_ASSOCIATION_ASSIGN 等价于 @property(assign)。
         OBJC_ASSOCIATION_RETAIN_NONATOMIC等价于 @property(strong, nonatomic)。
         OBJC_ASSOCIATION_COPY_NONATOMIC等价于@property(copy, nonatomic)。
         OBJC_ASSOCIATION_RETAIN等价于@property(strong,atomic)。
         OBJC_ASSOCIATION_COPY等价于@property(copy, atomic)。
         */
        set{
            let type1: UnsafeRawPointer! = UnsafeRawPointer.init(bitPattern: "type1".hashValue)
            objc_setAssociatedObject(self,type1 , newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
        /**
         objc_getAssocicatedObject用于获取关联对象的值。
         */
        get{
            let type1: UnsafeRawPointer! = UnsafeRawPointer.init(bitPattern: "type1".hashValue)
            let obj1: UILabelColorType? = objc_getAssociatedObject(self, type1) as? UILabelColorType
            return obj1
        }
    }
}
